// GameControl控制其他所有类

// 食物
import Food from './Food'
// 分数、等级
import ScorePanel from './ScorePanel'
// 蛇（蛇头+身体）
import Snake from './Snake'

class GameControl {
  //定义三个属性
  // 蛇
  snake: Snake;
  // 食物
  food: Food;
  // 记分牌
  scorePanel: ScorePanel;

  // 创建一个属性用来记录游戏是否结束
  isLive = true;

  // 创建一个属性来存储蛇的移动方向（也就是按键的方向）
  direction: string = 'ArrowRight';

  constructor() {
    this.food = new Food()
    this.snake = new Snake()
    this.scorePanel = new ScorePanel(13, 10)

    this.init()// 游戏初始化
  }

  // 游戏初始化
  init() {
    // 绑定键盘的按键（事件）
    document.addEventListener('keydown', this.keyDownHandler.bind(this))

    // 初始化后，蛇立刻开始移动
    this.snakeRun()
  }

  // 创建键盘按下的响应函数
  keyDownHandler(event: KeyboardEvent) {
    // console.log(event.key);
    // 修改方向direction属性
    this.direction = event.key
  }

  // 蛇🐍的运动控制
  snakeRun() {
    // ArrowUp Up w W
    // ArrowDown Down s S
    // ArrowLeft Left a A
    // ArrowRight Right d D
    // 检查用户的按键事件是否合法，只有以上的按键才可以控制

    // 获取蛇头的坐标
    let X = this.snake.X
    let Y = this.snake.Y

    switch (this.direction) {
      // 根据方向键键来修改坐标X值和Y值
      case "ArrowUp":
      case "Up":
      case "w":
      case "W":
        Y -= 10
        break;
      case "ArrowDown":
      case "Down":
      case "s":
      case "S":
        Y += 10
        break;
      case "ArrowLeft":
      case "Left":
      case "a":
      case "A":
        X -= 10
        break;
      case "ArrowRight":
      case "Right":
      case "d":
      case "D":
        X += 10
        break;
    }

    // 检查蛇是否吃到食物
    this.checkEatFood(X, Y)

    //修改蛇头的坐标X和Y值
    try {
      this.snake.X = X;
      this.snake.Y = Y;
    } catch (e) {
      // 如果出现异常，报错（游戏结束）
      alert(e)
      this.isLive = false
    }

    if (this.isLive) {
      // 开启定时调用snakeRun()
      setTimeout(this.snakeRun.bind(this), 200 - (this.scorePanel.level - 1) * 20)
    }
    console.log(this.scorePanel.level);
  }

  // 定义一个方法，用来检查蛇是否吃到食物
  // 蛇头的坐标和食物坐标一致
  checkEatFood(X: number, Y: number) {
    // 吃到了食物
    if (X === this.food.X && Y === this.food.Y) {

      // 刷新食物位置
      this.food.change()

      // 分数增加
      this.scorePanel.addScore()

      // 蛇增加长度
      this.snake.addBody()
    }
  }
}


export default GameControl